package com.zjj.learn.designmodel.work.prototype;

public class PrototypeTest {

    public static void main(String[] args) throws CloneNotSupportedException {
        //创建一个奖状
        MeritCertificateOfMeritStudent certificate = new MeritCertificateOfMeritStudent();
        certificate.setName("小美");
        //克隆一个新的奖状对象
        MeritCertificateOfMeritStudent certificate1 = certificate.clone();
        certificate1.setName("小丽");
        //展示奖状
        certificate.show();
        certificate1.show();
    }


    /**
     * 原型模式，原型模式是一种创建型模式
     * 原型模式是通过一个已经创建成功地对象，通过复制该对象创建一个和该对象相同的新对象。
     *
     *
     * 原型模型的克隆分为浅克隆和深克隆：
     *    浅克隆：是指仅克隆对象本身以及对象包含的基本数据类型成员变量，
     *           而不包括对象包含的引用类型成员变量，因此克隆后的对象与原始对象共享部分内存。
     *
     *    深克隆：是指将整个对象及其包含的所有成员变量都复制一份给新的对象，也就是说生成一个全新的对象，
     *           所以克隆后即使改变了其中一个对象的状态，也不会改变另一个对象的状态。
     * 具体案例：
     *    例如在班级发奖状时，相同奖项的奖状除了获奖学生的姓名不一样，其他的都相同，这时就可以使用原型模型。
     *    {@link com.zjj.learn.designmodel.work.prototype}
     *
     *
     * 最后需要注意的是，在Java中Object类提供了一个clone()方法，该方法默认实现是浅克隆，
     * 所以如果需要使用深克隆来保证新对象与原型对象完全独立，则必须在原型类中自行实现克隆方法。
     **/
}
